#pragma once

#include "noncopyable.h"

#include <functional>
#include <string>
#include <vector>
#include <memory>

class EventLoop;
class EventLoopThread;

class EventLoopThreadPool : noncopyable
{
public:
    using ThreadInitCallback = std::function<void(EventLoop *)>;

    EventLoopThreadPool(EventLoop *baseLoop, const std::string &nameArg);
    ~EventLoopThreadPool();

    // 设置线程数量
    void setThreadNum(int numThreads) { numThreads_ = numThreads; }

    // 启动线程池
    void start(const ThreadInitCallback &cb = ThreadInitCallback());

    // 获取下一个处理事件的EventLoop
    EventLoop *getNextLoop();

    // 获取所有EventLoop
    std::vector<EventLoop *> getAllLoops();

    bool started() const { return started_; }

    const std::string &name() const { return name_; }

private:
    EventLoop *baseLoop_; // 用户自己的（主线程的）EventLoop， EventLoop loop，不参与线程池管理
    std::string name_;    // 线程池名字
    bool started_;        // 标志线程池是否启动
    int numThreads_;      // 线程池大小，要创建的事件循环线程数量
    int next_;            // 轮询算法的索引，用于分配下一个事件循环
    std::vector<std::unique_ptr<EventLoopThread>> threads_;
    std::vector<EventLoop *> loops_; // 存储所有子线程的事件循环的指针
};